// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_TEST_MOCK_KEYBOARD_H_
#define CONTENT_TEST_MOCK_KEYBOARD_H_

#include <string>

#include "base/macros.h"
#include "build/build_config.h"

#if defined(OS_WIN)
#include "content/test/mock_keyboard_driver_win.h"
#endif

namespace content {

// A mock keyboard interface.
// This class defines a pseudo keyboard device, which implements mappings from
// a tuple (layout, key code, modifiers) to Unicode characters so that
// engineers can write RenderViewTest cases without taking care of such
// mappings. (This mapping is not trivial when using non-US keyboards.)
// A pseudo keyboard device consists of two parts: a platform-independent part
// and a platform-dependent part. This class implements the platform-independent
// part. The platform-dependet part is implemented in the MockKeyboardWin class.
// This class is usually called from RenderViewTest::SendKeyEvent().
class MockKeyboard {
public:
    // Represents keyboard-layouts.
    enum Layout {
        LAYOUT_NULL,
        LAYOUT_ARABIC,
        LAYOUT_BULGARIAN,
        LAYOUT_CHINESE_TRADITIONAL,
        LAYOUT_CZECH,
        LAYOUT_DANISH,
        LAYOUT_GERMAN,
        LAYOUT_GREEK,
        LAYOUT_UNITED_STATES,
        LAYOUT_SPANISH,
        LAYOUT_FINNISH,
        LAYOUT_FRENCH,
        LAYOUT_HEBREW,
        LAYOUT_HUNGARIAN,
        LAYOUT_ICELANDIC,
        LAYOUT_ITALIAN,
        LAYOUT_JAPANESE,
        LAYOUT_KOREAN,
        LAYOUT_POLISH,
        LAYOUT_PORTUGUESE_BRAZILIAN,
        LAYOUT_ROMANIAN,
        LAYOUT_RUSSIAN,
        LAYOUT_CROATIAN,
        LAYOUT_SLOVAK,
        LAYOUT_THAI,
        LAYOUT_SWEDISH,
        LAYOUT_TURKISH_Q,
        LAYOUT_VIETNAMESE,
        LAYOUT_DEVANAGARI_INSCRIPT,
        LAYOUT_PORTUGUESE,
        LAYOUT_UNITED_STATES_DVORAK,
        LAYOUT_CANADIAN_FRENCH,
    };

    // Enumerates keyboard modifiers.
    // These modifiers explicitly distinguish left-keys and right-keys because we
    // should emulate AltGr (right-alt) key, used by many European keyboards to
    // input alternate graph characters.
    enum Modifiers {
        INVALID = -1,
        NONE = 0,
        LEFT_SHIFT = 1 << 0,
        LEFT_CONTROL = 1 << 1,
        LEFT_ALT = 1 << 2,
        LEFT_META = 1 << 3,
        RIGHT_SHIFT = 1 << 4,
        RIGHT_CONTROL = 1 << 5,
        RIGHT_ALT = 1 << 6,
        RIGHT_META = 1 << 7,
        KEYPAD = 1 << 8,
        AUTOREPEAAT = 1 << 9,
    };

    MockKeyboard();
    ~MockKeyboard();

    // Retrieves Unicode characters composed from the the specified keyboard
    // layout, key code, and modifiers, i.e. characters returned when we type
    // specified keys on a specified layout.
    // This function returns the length of Unicode characters filled in the
    // |output| parameter.
    int GetCharacters(Layout layout,
        int key_code,
        Modifiers modifiers,
        std::wstring* output);

private:
#if defined(OS_WIN)
    Layout keyboard_layout_ = LAYOUT_NULL;
    Modifiers keyboard_modifiers_ = INVALID;
    MockKeyboardDriverWin driver_;
#endif

    DISALLOW_COPY_AND_ASSIGN(MockKeyboard);
};

} // namespace content

#endif // CONTENT_TEST_MOCK_KEYBOARD_H_
